﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ChartDirector;

namespace GoodTrader
{
    public class GTGlobal
    {
        public static int SysEndTime = 1500;
        // 옵션 활성화
        public static bool EnableOption = false;

        // 주문관련 속성
        public static bool AutoOrder = false;
        public static int OrderStartTime = 900;
        public static int OrderEndTime = 1515;


        public static double StartTime = 0900;
        
        public static double EndTime = 1515;
        
        public static double mEndDate = 0.0;
        public static int MaxDownloadCount = 470;
        public static int MaxDayDownloadCount = 80;
        public static DateTime[] StockTimeToDateTimes(double[] aSTimes)
        {
            DateTime[] tTimes = new DateTime[aSTimes.Length];

            return tTimes;
        }

        public static int TimeToIntEx()
        {
            DateTime curTime = DateTime.Now;
            string strCurTime = curTime.Hour.ToString();

            if (curTime.Minute < 10)
            {
                strCurTime += ("0" + curTime.Minute.ToString());
            }
            else
            {
                strCurTime += curTime.Minute.ToString();
            }

            if (curTime.Second < 10)
            {
                strCurTime += ("0" + curTime.Second.ToString());
            }
            else
            {
                strCurTime += curTime.Second.ToString();
            }

            return Convert.ToInt32(strCurTime);
        }

        public static int TimeToInt()
        {
            DateTime curTime = DateTime.Now;
            string strCurTime = curTime.Hour.ToString();

            if (curTime.Minute < 10)
            {
                strCurTime += ("0" + curTime.Minute.ToString());
            }
            else
            {
                strCurTime += curTime.Minute.ToString();
            }

            return Convert.ToInt32(strCurTime);
        }

        public static int TimeToInt(int a_Hour, int a_Min)
        {
            string strCurTime = a_Hour.ToString();

            if (a_Min < 10)
            {
                strCurTime += ("0" + a_Min.ToString());
            }
            else
            {
                strCurTime += a_Min.ToString();
            }

            return Convert.ToInt32(strCurTime);
        }

        public static int DateToInt()
        {
            DateTime curTime = DateTime.Now;
            string curDate = curTime.Year.ToString();
            if (curTime.Month < 10)
                curDate += ("0" + curTime.Month.ToString());
            else
                curDate += curTime.Month.ToString();
            if (curTime.Day < 10)
            {
                curDate += ("0" + curTime.Day.ToString());
            }
            else
            {
                curDate += curTime.Day.ToString();
            }

            return Convert.ToInt32(curDate);
        }

        public static void FindMinMax(double[] aSrc, ref double aMin, ref double aMax)
        {
            if (aSrc.Length == 0)
            {
                aMin = 0.0;
                aMax = 0.0;
                return;
            }
            aMin = aSrc[0];
            aMax = aSrc[0];
            for (int i = 0; i < aSrc.Length; i++)
            {
                if (aSrc[i] > aMax)
                    aMax = aSrc[i];
                if (aSrc[i] < aMin)
                    aMin = aSrc[i];
            }
        }

        public static void StockTimeToSysTime(double aSTime, ref int aHour, ref int aMin, ref int aSec)
        {
            string strTime = aSTime.ToString();
            int secondStart = 2;
            if (strTime.Length == 3)
                secondStart = 1;
            if (strTime == "0")
            {
                aHour = 0;
                aMin = 0;
                aSec = 0;
            }
            else
            {
                string hour = strTime.Substring(0, secondStart);
                string minute = strTime.Substring(secondStart, 2);
                aHour = int.Parse(hour);
                if (aHour > 23)
                    aHour = 23;
                aMin = int.Parse(minute);
                if (aMin > 59)
                    aMin = 59;
                aSec = 0;
            }
        }

        public static void ShiftArrayVal(double aNewVal, double[] aSrcArray, double[] aTempArray)
        {
            // 배열의 길이 값이 다르면 아무일도 하지 않는다.
            if (aSrcArray.Length != aTempArray.Length)
                return;
            // 원래 값을 임시 배열에 복사한다.
            Array.Copy(aSrcArray, aTempArray, aSrcArray.Length);
            // 맨 마지막 값을 채운다.
            aSrcArray[aSrcArray.Length - 1] = aNewVal;
            // 임시 배열의 값을 원래 배열에 복사한다.
            Array.Copy(aTempArray, 1, aSrcArray, 0, aTempArray.Length - 1);
        }

        /**
          @brief 이 함수를 배열을 왼쪽으로 이동하고 이동된 만큼의 빈 자리를 새로운 값으로 채운다.
          @param aLastVal : 새로 들어온 맨 마지막 값 - 배열을 마지막 요소에 들어감
          @param aBeforeVal : 새로 들어온 맨 마지막 이전의 값 - 배열의 마지막 요소 전에 들어감
          @param aSrcArray : 옮기려는 원본 배열
          @param aTempArray : 원본 배열을 임시로 복사해 놓을 임시배열
         */
        public static void ShiftArrayVal(double aLastVal, double aBeforeVal, double[] aSrcArray, double[] aTempArray)
        {
            // 배열의 길이 값이 다르면 아무일도 하지 않는다.
            if (aSrcArray.Length != aTempArray.Length)
                return;
            // 원래 값을 임시 배열에 복사한다.
            Array.Copy(aSrcArray, aTempArray, aSrcArray.Length);
            // 임시 배열의 값을 원래 배열에 복사한다.
            Array.Copy(aTempArray, 1, aSrcArray, 0, aTempArray.Length - 1);
            // 맨 마지막 값을 채운다.
            aSrcArray[aSrcArray.Length - 1] = aLastVal;
            // 맨 마지막 이전의 값을 채운다.
            aSrcArray[aSrcArray.Length - 2] = aBeforeVal;
        }
        /**
         * @brief 이 함수는 증권사 날짜 형식을 시스템 날짜 형식으로 바꾸어준다.
         * @param aSDate : 증권사에서 받아 온 날짜 형식. 예) 20010405 - double 형으로 되어 있음
         * @param aYear  : 년도를 담을 반환 변수
         * @param aMonth  : 월을 담을 반환 변수
         * @param aDay  : 일을 담을 반환 변수 
         * @remark : 증권사 날짜는 정수형식으로 붙어 있기 때문에 이것을 년,월,일로 분리해서 준다.
         */
        public static void StockDateToSysDate(double aSDate, ref int aYear, ref int aMonth, ref int aDay)
        {
            string strDate = aSDate.ToString();
            if (strDate == "0")
            {
                aYear = 0;
                aMonth = 0;
                aDay = 0;
            }
            else
            {
                string year = strDate.Substring(0, 4);
                string month = strDate.Substring(4, 2);
                string day = strDate.Substring(6, 2);
                aYear = int.Parse(year);
                aMonth = int.Parse(month);
                aDay = int.Parse(day);
            }
        }

        public static void StockTimeToChartDirectorTime(double[] aSDate, double[] aSTimes, double[] aCTime)
        {
            for (int i = 0; i < aSTimes.Length; i++)
            {
                string strDate = aSDate[i].ToString();
                if (strDate == "0")
                {
                    break;
                }

                string year = strDate.Substring(0, 4);
                string month = strDate.Substring(4, 2);
                string day = strDate.Substring(6, 2);

                //DateTime dTime = new DateTime(2014, 01, 14);
                //dTime.Year = 2014;

                string strTime = aSTimes[i].ToString();
                int secondStart = 2;
                if (strTime.Length == 3)
                    secondStart = 1;
                if (strTime == "0")
                {
                    aCTime[i] = ChartDirector.Chart.chartTime(int.Parse(year), int.Parse(month), int.Parse(day), 0, 0, 0);
                }
                else
                {
                    string hour = strTime.Substring(0, secondStart);
                    string minute = strTime.Substring(secondStart, 2);
                    aCTime[i] = ChartDirector.Chart.chartTime(int.Parse(year), int.Parse(month), int.Parse(day), int.Parse(hour), int.Parse(minute), 0);
                }
            }
        }

        public static void StockTimeToSystemTime(double[] aSDate, double[] aSTimes, DateTime[] aCTime)
        {
            for (int i = 0; i < aSTimes.Length; i++)
            {
                string strDate = aSDate[i].ToString();
                if (strDate == "0")
                {
                    break;
                }

                string year = strDate.Substring(0, 4);
                string month = strDate.Substring(4, 2);
                string day = strDate.Substring(6, 2);

                //DateTime dTime = new DateTime(2014, 01, 14);
                //dTime.Year = 2014;

                string strTime = aSTimes[i].ToString();
                int secondStart = 2;
                if (strTime.Length == 3)
                    secondStart = 1;
                if (strTime == "0")
                {
                    aCTime[i] = new DateTime(int.Parse(year), int.Parse(month), int.Parse(day), 0, 0, 0);
                }
                else
                {
                    string hour = strTime.Substring(0, secondStart);
                    string minute = strTime.Substring(secondStart, 2);
                    aCTime[i] = new DateTime(int.Parse(year), int.Parse(month), int.Parse(day), int.Parse(hour), int.Parse(minute), 0);
                }
            }
        }

        public static string StockTimeToSysTime(double aSTime)
        {
            string strTime = aSTime.ToString();
            int secondStart = 2;
            if (strTime.Length == 3)
                secondStart = 1;
            if (strTime == "0")
            {
                strTime = "00 : 00";
            }
            else
            {
                string hour = strTime.Substring(0, secondStart);
                string minute = strTime.Substring(secondStart, 2);
                strTime = hour + " : " + minute;
            }

            return strTime;
        }

        //--------------------------------------------------------------------------------------
        /**@brief 증권사 시간좌표를 차트 시간으로 변경한다.
         @param aSDate : 증권사에서 받은 날짜값 YYYYMMDD. 예)20140314
         @param aSTime : 증권사에서 받은 시간값 HHMM. 예) 1405
         @param aCTiem : 차트 시간 : 변환해서 받을 값
         @return void : 없음
         @remark aCTime이 변환된 값을 받는다.
        *///------------------------------------------------------------------------------------ 
        public static void StockTimeToChartDirectorTime(double aSDate, double aSTime, ref double aCTime)
        {
            string strDate = aSDate.ToString();
            if (strDate == "0")
            {
                return;
            }

            string year = strDate.Substring(0, 4);
            string month = strDate.Substring(4, 2);
            string day = strDate.Substring(6, 2);

            string strTime = aSTime.ToString();
            int secondStart = 2;
            if (strTime.Length == 3)
                secondStart = 1;
            if (strTime == "0")
            {
                aCTime = ChartDirector.Chart.chartTime(int.Parse(year), int.Parse(month), int.Parse(day), 0, 0, 0);
            }
            else
            {
                string hour = strTime.Substring(0, secondStart);
                string minute = strTime.Substring(secondStart, 2);
                aCTime = ChartDirector.Chart.chartTime(int.Parse(year), int.Parse(month), int.Parse(day), int.Parse(hour), int.Parse(minute), 0);
            }
        }

        public static void StockTimeToChartDirectorTime(DateTime[] aSTimes, double[] aCTime)
        {
            if (aSTimes.Length != aCTime.Length)
                return;

            for (int i = 0; i < aSTimes.Length; i++)
            {
                aCTime[i] = ChartDirector.Chart.CTime(aSTimes[i]);
            }
        }

        /**
          @brief 이 함수를 배열을 왼쪽으로 이동하고 이동된 만큼의 빈 자리를 새로운 값으로 채운다.
          @param aLastVal : 새로 들어온 맨 마지막 값 - 배열을 마지막 요소에 들어감
          @param aBeforeVal : 새로 들어온 맨 마지막 이전의 값 - 배열의 마지막 요소 전에 들어감
          @param aSrcArray : 옮기려는 원본 배열
          @param aTempArray : 원본 배열을 임시로 복사해 놓을 임시배열
         */
        public static void ShiftArrayLeft(int a_Count, double[] a_SrcArray, double[] a_TempArray)
        {
            // 배열의 길이 값이 다르면 아무일도 하지 않는다.
            if (a_SrcArray.Length != a_TempArray.Length)
                return;
            // 원래 값을 임시 배열에 복사한다.
            Array.Copy(a_SrcArray, a_TempArray, a_SrcArray.Length);
            // 임시 배열의 값을 원래 배열에 복사한다.
            Array.Copy(a_TempArray, a_Count, a_SrcArray, 0, a_TempArray.Length - a_Count);
        }
    }
}
